// 清除依赖函数
function cleanup(effectFn) {
    for (let i = 0; i < effectFn.deps.length; i++) {
      const deps = effectFn.deps[i]
      deps.delete(effectFn)
    }
    effectFn.deps.length = 0
  }
  // 侦听器工具函数 用来深度监听
  function traverse(value, seen = new Set()) {
    // 如果要读取的数据是原始值，或者已经被读取过了，那么什么都不做
    if (typeof value !== 'object' || value === null || seen.has(value)) return
    // 将数据添加到seen中，代表遍历地读取过了，避免循环引用引起的死循环
    seen.add(value)
    // 假设value就是一个对象，使用for...in读取对象的每一个值，并递归地调用traverse进行处理
    for (const k in value) {
      traverse(value[k], seen)
    }
    return value
  }